package com.example.nirvana.design.singleton;

import java.io.Serializable;

/**
 * 单例模式-懒汉式（静态内部类）
 * @decription 消除加锁带来的性能问题，利用了java代码的一种特性，静态内部类在主类加载的时候是不会被加载的，只有当调用getInstance()方法的时候才会被加载进来进行初始化
 */
public class LazyInnerClassSingleton implements Serializable {
    private LazyInnerClassSingleton() {
        //防止通过反射破坏单例
        if(LazyHolder.INSTANCE != null) {
            throw new RuntimeException("不要试图用反射破坏单例模式!");
        }
    }

    public static LazyInnerClassSingleton getInstance() {
        return LazyHolder.INSTANCE;
    }

    /**
     * 防止通过序列化破坏单例
     */
    private Object readResolve() {
        return LazyHolder.INSTANCE;
    }

    private static class LazyHolder {
        private static final LazyInnerClassSingleton INSTANCE = new LazyInnerClassSingleton();
    }
}
